package com.doctcloud.common.shardingsphere.utils;

import cn.hutool.core.lang.Snowflake;
import cn.hutool.core.util.IdUtil;

public class ShardingKeyGenerator {
    // 初始化雪花算法（workerId 和 dataCenterId 需保证分布式环境唯一，可通过配置动态设置）
    private static final Snowflake SNOWFLAKE = IdUtil.createSnowflake(1, 1); // workerId=1, dataCenterId=1

    // 基于雪花算法，生成包含分片因子（如用户ID哈希）的全局唯一ID
    public static Long generateShardingKey(Long userId) {
        // 1. 计算用户ID的哈希值（用于分库/分表路由）
        int shardingFactor = Math.abs(userId.hashCode() % 8); // 假设分8个库/表
        // 2. 生成雪花ID（此处简化，实际可集成hutool的Snowflake）
        long snowflakeId = SNOWFLAKE.nextId();
        // 3. 将分片因子嵌入ID（如低8位存储分片因子）
        return (snowflakeId & ~0xFFL) | shardingFactor;
    }

    // 从ID中解析分片因子（供路由使用）
    public static int parseShardingFactor(Long shardingKey) {
        return (int) (shardingKey & 0xFFL);
    }
}